package com.quirka.igu;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.image.BufferedImage;
import java.io.File;

import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollBar;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.filechooser.FileFilter;
import javax.swing.filechooser.FileSystemView;

import com.quirka.logica.CalcularVectorHistograma;
import com.quirka.logica.ConvertirEscalaDeGrises;
import com.quirka.logica.EcualizarImagen;
import com.quirka.logica.filtro.Filtro;
import com.quirka.logica.filtro.FiltroImagen;
import com.quirka.logica.filtro.FiltroMedia;
import com.quirka.logica.filtro.FiltroMediana;


public class VentanaPrincipalUI
    extends JFrame implements ActionListener
{
    
    private JSplitPane sppImages=null;
    private JSplitPane sppHistograma=null;
    private HistogramaUI histogramaUIMod=null;
    private HistogramaUI histogramaUIOrig=null;
    private JScrollPane jspImagenMod=null;
    private JScrollPane jspImagenOrig=null;
    private JScrollPane jsphistogramaMod=null;
    private JScrollPane jsphistogramaOrig=null;
    private JPanel jpBotonera=null;
    private ImageIcon iconMod=null;
    private ImageIcon iconOrig=null;
    private JFileChooser fc = new JFileChooser();
    private JComboBox cbxFiltros=null;
    private JButton btnBuscarArchivo=null;
    private JButton btnEcualizar=null;    
    private JButton btnFiltrar=null;
    
    private File pathImagenColor=null;
    private BufferedImage buffImagenGrisesMod=null;
    private BufferedImage buffImagenGrisesOrig=null;
    private ImagenCanvasUI dibujoImagenMod=null;
    private ImagenCanvasUI dibujoImagenOrig=null;
    private int []n;
    
    
    

    
    public void init(){
        
        setLayout(new BorderLayout());
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        
        jspImagenMod=new JScrollPane();
        jspImagenOrig=new JScrollPane();
        
        iconMod=new ImageIcon();
        iconOrig=new ImageIcon();
        
        jspImagenMod.getViewport().add(new JLabel(iconMod));
        jspImagenMod.setAutoscrolls(true);
        
        jspImagenOrig.getViewport().add(new JLabel(iconOrig));
        jspImagenOrig.setAutoscrolls(true);
        
        sppImages= new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,
            jspImagenOrig,jspImagenMod);
        

        
        getContentPane().add(BorderLayout.CENTER, sppImages);
        
        histogramaUIMod=new HistogramaUI();
        
        jsphistogramaMod=new JScrollPane();
        jsphistogramaMod.getViewport().add(histogramaUIMod);
        jsphistogramaMod.setAutoscrolls(true);
        
        histogramaUIOrig=new HistogramaUI();
        
        jsphistogramaOrig=new JScrollPane();
        jsphistogramaOrig.getViewport().add(histogramaUIOrig);
        jsphistogramaOrig.setAutoscrolls(true);
        
        sppHistograma=new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,
            jsphistogramaOrig,jsphistogramaMod);
        
        getContentPane().add(BorderLayout.AFTER_LAST_LINE, sppHistograma);
        
        
        jpBotonera=new JPanel(new FlowLayout());
        getContentPane().add(BorderLayout.BEFORE_FIRST_LINE, jpBotonera);
   
        btnBuscarArchivo=new JButton("Buscar Archivo...");
        btnBuscarArchivo.addActionListener(this);
        jpBotonera.add(btnBuscarArchivo);
        
        btnEcualizar=new JButton("Ecualizar");
        btnEcualizar.addActionListener(this);
        jpBotonera.add(btnEcualizar);
        
        
        int [][]filtro1={{1,1,1},{1,1,1},{1,1,1}};
        int [][]filtro2={{1,1,1,1,1},{1,1,1,1,1},{1,1,1,1,1},{1,1,1,1,1},{1,1,1,1,1}};
        
        Filtro []filtros={new FiltroMedia("Media 3x3",filtro1),
        		          new FiltroMedia("Media 5x5",filtro2),
                          new FiltroMediana("Mediana 3x3",3),
                          new FiltroMediana("Mediana 5x5",5)
                          };
        
        cbxFiltros=new JComboBox(filtros);                
        jpBotonera.add(cbxFiltros);
       
        
        btnFiltrar=new JButton("Filtrar");
        btnFiltrar.addActionListener(this);
        jpBotonera.add(btnFiltrar);
        
        fc=new JFileChooser("C:/");
        fc.addChoosableFileFilter(new ImageFilter());
        fc.setMultiSelectionEnabled(false);

        fc.setFileSelectionMode(JFileChooser.FILES_ONLY);
        
        setSize(800,500);
        setVisible(true);
    }
    
   public static void main(String argv[]) {         
       VentanaPrincipalUI f = new VentanaPrincipalUI();
       
       f.init();
       
      
   }

    @Override
    public void actionPerformed(ActionEvent e)
    {
        //Handle open button action.
        if (e.getSource() == btnBuscarArchivo) {
            int returnVal = fc.showOpenDialog(null);
    
            if (returnVal == JFileChooser.APPROVE_OPTION) {
                pathImagenColor = fc.getSelectedFile();
                seleccionarImagen();
            }
       } 
        if (e.getSource() == btnEcualizar) {
            ecualizarHistograma();
       }
        if (e.getSource() == btnFiltrar) {
            filtrarImagen();
       }
    }
    
    public void seleccionarImagen(){
        
        buffImagenGrisesOrig=ConvertirEscalaDeGrises.convertir(pathImagenColor);        
        buffImagenGrisesMod=ConvertirEscalaDeGrises.convertir(pathImagenColor);
        updateInfoImagenMod();   
        updateInfoImagenOrig();
     
    }
    
    private void ecualizarHistograma(){
        EcualizarImagen.ecualizar(buffImagenGrisesMod,n);
        updateInfoImagenMod();
    }
    
    private void filtrarImagen(){

        FiltroImagen.filtrar(buffImagenGrisesMod,((Filtro)cbxFiltros.getSelectedItem()));
        updateInfoImagenMod();
    }
    
    
    private void updateInfoImagenMod(){
        n=CalcularVectorHistograma.calcular(buffImagenGrisesMod);
        dibujoImagenMod=new ImagenCanvasUI(buffImagenGrisesMod);
        iconMod.setImage(buffImagenGrisesMod);
        histogramaUIMod.showHistogram(n);        
        jspImagenMod.updateUI();
    }
    
    private void updateInfoImagenOrig(){
        int []nOrig=CalcularVectorHistograma.calcular(buffImagenGrisesOrig);
        dibujoImagenOrig=new ImagenCanvasUI(buffImagenGrisesOrig);
        iconOrig.setImage(buffImagenGrisesOrig);
        histogramaUIOrig.showHistogram(nOrig);        
        jspImagenOrig.updateUI();
    }
}
